Pythonã®ãã€ãã³ãŒãããŒãããŒã«æé©åã®åãæ¢æ±ãããã©ãŒãã³ã¹åäžãã³ãŒããµã€ãºã®åæžãå®è¡ã®æé©åã«ã€ããŠåŠã³ãŸããããå®è·µçãªäŸãå«ãŸããŠããŸãã
Pythonã³ã³ãã€ã©ã®æé©åïŒãã€ãã³ãŒãããŒãããŒã«æé©åæè¡
èªã¿ããããšäœ¿ããããã§æåãªPythonã¯ãCãC++ãªã©ã®äœæ°Žæºèšèªãšæ¯èŒããŠããã®ããã©ãŒãã³ã¹ããã°ãã°æ¹å€ãããŸãããã®éãã«ã¯ããŸããŸãªèŠå ãå¯äžããŠããŸãããPythonã€ã³ã¿ããªã¿ã¯éèŠãªåœ¹å²ãæãããŠããŸããPythonã³ã³ãã€ã©ãã©ã®ããã«ã³ãŒããæé©åããŠããããçè§£ããããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®å¹çãåäžããããéçºè ã«ãšã£ãŠäžå¯æ¬ ã§ãã
ãã®èšäºã§ã¯ãPythonã³ã³ãã€ã©ãæ¡çšããŠããäž»èŠãªæé©åæè¡ã®1ã€ã§ãããã€ãã³ãŒãããŒãããŒã«æé©åã«ã€ããŠæãäžããŠãããŸãããããäœã§ããããã©ã®ããã«æ©èœãããããããŠPythonã³ãŒããããé«éãã€ã³ã³ãã¯ãã«ããã®ã«ã©ã®ããã«è²¢ç®ããŠãããã説æããŸãã
Pythonãã€ãã³ãŒãã®çè§£
ããŒãããŒã«æé©åã«å ¥ãåã«ãPythonãã€ãã³ãŒããçè§£ããããšãéèŠã§ããPythonã¹ã¯ãªãããå®è¡ãããšãã€ã³ã¿ããªã¿ã¯æåã«ãœãŒã¹ã³ãŒãããã€ãã³ãŒããšåŒã°ããäžé衚çŸã«å€æããŸãããã®ãã€ãã³ãŒãã¯ãPython Virtual Machine (PVM)ã«ãã£ãŠå®è¡ãããäžé£ã®åœä»€ã§ãã
disã¢ãžã¥ãŒã«ïŒãã£ã¹ã¢ã»ã³ãã©ïŒã䜿çšããŠãPython颿°ã«å¯ŸããŠçæããããã€ãã³ãŒããæ€æ»ã§ããŸãã
import dis
def add(a, b):
return a + b
dis.dis(add)
åºåã¯æ¬¡ã®ããã«ãªããŸãïŒPythonã®ããŒãžã§ã³ã«ãã£ãŠè¥å¹²ç°ãªãå ŽåããããŸãïŒã
4 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_OP 0 (+)
6 RETURN_VALUE
以äžã¯ããã€ãã³ãŒãåœä»€ã®å èš³ã§ãã
LOAD_FAST: ããŒã«ã«å€æ°ãã¹ã¿ãã¯ã«ããŒãããŸããBINARY_OP: ã¹ã¿ãã¯ã®äžçªäžã®2ã€ã®èŠçŽ ã䜿çšããŠã2é æŒç®ïŒãã®å Žåã¯å ç®ïŒãå®è¡ããŸããRETURN_VALUE: ã¹ã¿ãã¯ã®äžçªäžãè¿ããŸãã
ãã€ãã³ãŒãã¯ãã©ãããã©ãŒã ã«äŸåããªã衚çŸã§ãããPythonã³ãŒãã¯Pythonã€ã³ã¿ããªã¿ãåããä»»æã®ã·ã¹ãã ã§å®è¡ã§ããŸãããã ããæé©åã®æ©äŒãçãŸããã®ã¯ããã§ãã
ããŒãããŒã«æé©åãšã¯ïŒ
ããŒãããŒã«æé©åã¯ãäžåºŠã«å°æ°ã®ãã€ãã³ãŒãåœä»€ã®ããŠã£ã³ããŠãïŒãŸãã¯ãããŒãããŒã«ãïŒã調ã¹ãããšã«ãã£ãŠæ©èœãããã·ã³ãã«ã§ãããªãã广çãªæé©åæè¡ã§ããããå¹ççãªä»£æ¿ææ®µã«çœ®ãæããããšãã§ããç¹å®ã®åœä»€ã®ãã¿ãŒã³ãæ¢ããŸããéèŠãªã¢ã€ãã¢ã¯ãåé·ãŸãã¯éå¹çãªã·ãŒã±ã³ã¹ãç¹å®ããããããåçã§ããããããé«éãªã·ãŒã±ã³ã¹ã«å€æããããšã§ãã
ãããŒãããŒã«ããšããçšèªã¯ãæé©åããŒã«ãã³ãŒãã«å¯ŸããŠæã€ãå°ãã屿åããããã¥ãŒãæããŸããããã°ã©ã å šäœã®æ§é ãçè§£ããããšããã®ã§ã¯ãªããåœä»€ã®çãã·ãŒã±ã³ã¹ã®æé©åã«çŠç¹ãåœãŠãŠããŸãã
Pythonã§ã®ããŒãããŒã«æé©åã®ä»çµã¿
Pythonã³ã³ãã€ã©ïŒå ·äœçã«ã¯CPythonã³ã³ãã€ã©ïŒã¯ãæœè±¡æ§ææšïŒASTïŒããã€ãã³ãŒãã«å€æãããåŸãã³ãŒãçæãã§ãŒãºäžã«ããŒãããŒã«æé©åãå®è¡ããŸããæé©åããŒã«ã¯ãã€ãã³ãŒãããã©ããŒã¹ããå®çŸ©æžã¿ã®ãã¿ãŒã³ãæ¢ããŸããäžèŽãããã¿ãŒã³ãèŠã€ãããšãããå¹ççãªåçç©ã§çœ®ãæããããŸãããã®ããã»ã¹ã¯ããã以äžã®æé©åãé©çšã§ããªããªããŸã§ç¹°ãè¿ãããŸãã
CPythonãå®è¡ããããŒãããŒã«æé©åã®äžè¬çãªäŸãããã€ãèŠãŠã¿ãŸãããã
1. 宿°ç³ã¿èŸŒã¿
宿°ç³ã¿èŸŒã¿ã¯ãå®è¡æã§ã¯ãªãã³ã³ãã€ã«æã«å®æ°åŒãè©äŸ¡ããããšãå«ã¿ãŸããäŸïŒ
def calculate():
return 2 + 3 * 4
dis.dis(calculate)
宿°ç³ã¿èŸŒã¿ãªãã®å Žåããã€ãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
1 0 LOAD_CONST 1 (2)
2 LOAD_CONST 2 (3)
4 LOAD_CONST 3 (4)
6 BINARY_OP 4 (*)
8 BINARY_OP 0 (+)
10 RETURN_VALUE
ãã ãã宿°ç³ã¿èŸŒã¿ã䜿çšãããšãã³ã³ãã€ã©ã¯çµæïŒ2 + 3 * 4 = 14ïŒãäºåã«èšç®ããåŒå šäœãåäžã®å®æ°ã«çœ®ãæããããšãã§ããŸãã
1 0 LOAD_CONST 1 (14)
2 RETURN_VALUE
ããã«ãããå®è¡æã«å®è¡ãããåœä»€ã®æ°ãå€§å¹ ã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
2. 宿°äŒæ
宿°äŒæã¯ã宿°å€ãä¿æãã倿°ããããã®å®æ°å€ã«çŽæ¥çœ®ãæããããšãå«ã¿ãŸãããã®äŸãèããŠã¿ãŸãããã
def greet():
message = "Hello, World!"
print(message)
dis.dis(greet)
æé©åããŒã«ã¯ã宿°æååãHello, World!ããprint颿°åŒã³åºãã«çŽæ¥äŒæããŠãmessage倿°ãããŒãããå¿
èŠããªããå¯èœæ§ããããŸãã
3. ãããã³ãŒãã®åé€
ãããã³ãŒãã®åé€ã¯ãããã°ã©ã ã®åºåã«åœ±é¿ãäžããªãã³ãŒããåé€ããŸããããã¯ãæªäœ¿çšã®å€æ°ãåžžã«falseã®æ¡ä»¶ä»ãåå²ãªã©ãããŸããŸãªçç±ã§çºçããå¯èœæ§ããããŸããäŸïŒ
def useless():
x = 10
y = 20
if False:
z = x + y
return x
dis.dis(useless)
if Falseãããã¯å
ã®z = x + yè¡ã¯å®è¡ãããããšã¯ãªããæé©åããŒã«ã«ãã£ãŠå®å
šã«åé€ã§ããŸãã
4. ãžã£ã³ãã®æé©å
ãžã£ã³ãã®æé©åã¯ããžã£ã³ãåœä»€ïŒäŸïŒJUMP_FORWARDãJUMP_IF_FALSE_OR_POPïŒãç°¡çŽ åããŠããžã£ã³ãã®æ°ãæžãããå¶åŸ¡ãããŒãåçåããããšã«çŠç¹ãåœãŠãŠããŸããããšãã°ããžã£ã³ãåœä»€ãå¥ã®ãžã£ã³ãåœä»€ã«ããã«ãžã£ã³ãããå Žåãæåã®ãžã£ã³ããæçµçãªã¿ãŒã²ããã«ãªãã€ã¬ã¯ãã§ããŸãã
5. ã«ãŒãã®æé©å
ããŒãããŒã«æé©åã¯äž»ã«çãåœä»€ã·ãŒã±ã³ã¹ã«çŠç¹ãåœãŠãŠããŸãããã«ãŒãå ã®åé·ãªæäœãç¹å®ããŠåé€ããããšã«ãããã«ãŒãã®æé©åã«ãè²¢ç®ã§ããŸããããšãã°ãã«ãŒã倿°ã«äŸåããªãã«ãŒãå ã®å®æ°åŒã¯ãã«ãŒãã®å€éšã«ç§»åã§ããŸãã
ãã€ãã³ãŒãããŒãããŒã«æé©åã®å©ç¹
ãã€ãã³ãŒãããŒãããŒã«æé©åã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒå®è¡æã«å®è¡ãããåœä»€ã®æ°ãæžããããšã§ãããŒãããŒã«æé©åã¯Pythonã³ãŒãã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- ã³ãŒããµã€ãºã®åæžïŒãããã³ãŒããæé€ããåœä»€ã·ãŒã±ã³ã¹ãç°¡çŽ åãããšããã€ãã³ãŒããµã€ãºãå°ãããªããã¡ã¢ãªæ¶è²»éãåæžãããããŒãæéãççž®ãããŸãã
- ã·ã³ãã«ãïŒããŒãããŒã«æé©åã¯ãå®è£ ãæ¯èŒçç°¡åãªæè¡ã§ãããè€éãªããã°ã©ã åæãå¿ èŠãšããŸããã
- ãã©ãããã©ãŒã éäŸåæ§ïŒæé©åã¯ãã©ãããã©ãŒã ã«äŸåããªããã€ãã³ãŒãã§å®è¡ããããããããŸããŸãªã·ã¹ãã ã§ã¡ãªãããå®çŸãããŸãã
ããŒãããŒã«æé©åã®å¶é
ãã®å©ç¹ã«ãããããããããŒãããŒã«æé©åã«ã¯ããã€ãã®å¶éããããŸãã
- ç¯å²ã®å¶éïŒããŒãããŒã«æé©åã¯ãçãåœä»€ã·ãŒã±ã³ã¹ã®ã¿ãèæ ®ãããããã³ãŒãã®ããåºãçè§£ãå¿ èŠãšããããè€éãªæé©åãå®è¡ããèœåãå¶éãããŸãã
- æé©ãšã¯èšããªãçµæïŒããŒãããŒã«æé©åã¯ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãããåžžã«æè¯ã®çµæãåŸããããšã¯éããŸãããã°ããŒãã«æé©åãæç¶ãéåæãªã©ã®ããé«åºŠãªæé©åæè¡ã¯ããããªãæ¹åãããããå¯èœæ§ããããŸãã
- CPythonåºæïŒå®è¡ãããç¹å®ã®ããŒãããŒã«æé©åã¯ãPythonå®è£ ïŒCPythonïŒã«äŸåããŸããä»ã®Pythonå®è£ ã§ã¯ãç°ãªãæé©åæŠç¥ã䜿çšããå ŽåããããŸãã
å®è·µçãªäŸãšåœ±é¿
ããã€ãã®ããŒãããŒã«æé©åã®è€åçãªå¹æã瀺ãããã«ããã詳现ãªäŸã調ã¹ãŠã¿ãŸããããã«ãŒãå ã§ç°¡åãªèšç®ãå®è¡ãã颿°ãèããŠã¿ãŸãããã
def compute(n):
result = 0
for i in range(n):
result += i * 2 + 1
return result
dis.dis(compute)
æé©åãªãã®å Žåãã«ãŒãã®ãã€ãã³ãŒãã«ã¯ãåå埩ã«å¯ŸããŠè€æ°ã®LOAD_FASTãLOAD_CONSTãBINARY_OPåœä»€ãå«ãŸããå¯èœæ§ããããŸãããã ããããŒãããŒã«æé©åã䜿çšãããšã宿°ç³ã¿èŸŒã¿ã¯ãiã宿°ã§ããããšãããã£ãŠããå ŽåïŒãŸãã¯ãããã³ã³ããã¹ãã§ã³ã³ãã€ã«æã«ç°¡åã«æŽŸçã§ããå€ïŒã«ãi * 2 + 1ãäºåã«èšç®ã§ããŸããããã«ããžã£ã³ãã®æé©åã«ãããã«ãŒãã®å¶åŸ¡ãããŒãåçåã§ããŸãã
ããŒãããŒã«æé©åã®æ£ç¢ºãªåœ±é¿ã¯ã³ãŒãã«ãã£ãŠç°ãªãå¯èœæ§ããããŸãããç¹ã«èšç®è² è·ã®é«ãã¿ã¹ã¯ããé »ç¹ãªã«ãŒãå埩ã䌎ãã³ãŒãã®å Žåãäžè¬çã«ããã©ãŒãã³ã¹ãé¡èã«åäžããŸãã
ããŒãããŒã«æé©åãæŽ»çšããæ¹æ³
Pythonéçºè ãšããŠãããŒãããŒã«æé©åãçŽæ¥å¶åŸ¡ããããšã¯ã§ããŸãããCPythonã³ã³ãã€ã©ã¯ãã³ã³ãã€ã«ããã»ã¹äžã«ãããã®æé©åãèªåçã«é©çšããŸãããã ããããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãæé©åã«é©ããã³ãŒããèšè¿°ã§ããŸãã
- 宿°ã®äœ¿çšïŒã³ã³ãã€ã©ã宿°ç³ã¿èŸŒã¿ãšäŒæãå®è¡ã§ããããã«ãå¯èœãªéã宿°ã䜿çšããŸãã
- äžèŠãªèšç®ãé¿ããïŒç¹ã«ã«ãŒãå ã§ãåé·ãªèšç®ãæå°éã«æããŸããå¯èœã§ããã°ãã«ãŒãã®å€éšã«å®æ°åŒãç§»åããŸãã
- ã³ãŒããã¯ãªãŒã³ã§ã·ã³ãã«ã«ä¿ã€ïŒã³ã³ãã€ã©ãåæããŠæé©åãããããæç¢ºã§ç°¡æœãªã³ãŒããèšè¿°ããŸãã
- ã³ãŒãã®ãããã¡ã€ãªã³ã°ïŒãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããæå€§ã®å¹æãåŸãããé åã«æé©åã®åãçµã¿ãéäžãããŸãã
ããŒãããŒã«æé©åãè¶ ããŠïŒãã®ä»ã®æé©åæè¡
ããŒãããŒã«æé©åã¯ãPythonã³ãŒããæé©åããå Žåã®ããºã«ã®1ã€ã®éšåã«ãããŸããããã®ä»ã®æé©åæè¡ã«ã¯ä»¥äžãå«ãŸããŸãã
- Just-In-TimeïŒJITïŒã³ã³ãã€ã«ïŒPyPyãªã©ã®JITã³ã³ãã€ã©ã¯ãPythonã³ãŒããã©ã³ã¿ã€ã æã«ãã€ãã£ããã·ã³ã³ãŒãã«åçã«ã³ã³ãã€ã«ããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
- CythonïŒCythonã䜿çšãããšãPythonã®ãããªã³ãŒããCã«ã³ã³ãã€ã«ã§ãããããPythonãšCã®ããã©ãŒãã³ã¹éã®ããªããžãæäŸãããŸãã
- ãã¯ãã«åïŒNumPyã®ãããªã©ã€ãã©ãªã¯ããã¯ãã«åãããæäœãå¯èœã«ããäžåºŠã«é åå šäœã§æäœãå®è¡ããããšã«ãããæ°å€èšç®ãå€§å¹ ã«é«éåã§ããŸãã
- éåæããã°ã©ãã³ã°ïŒ
asyncioã䜿çšããéåæããã°ã©ãã³ã°ã«ãããã¡ã€ã³ã¹ã¬ããããããã¯ããã«ãè€æ°ã®ã¿ã¹ã¯ãåæã«åŠçã§ããåæå®è¡ã³ãŒããèšè¿°ã§ããŸãã
çµè«
ãã€ãã³ãŒãããŒãããŒã«æé©åã¯ãPythonã³ã³ãã€ã©ãPythonã³ãŒãã®ããã©ãŒãã³ã¹ãåäžããããµã€ãºãå°ããããããã«æ¡çšããŠãã䟡å€ã®ããæè¡ã§ãããã€ãã³ãŒãåœä»€ã®çãã·ãŒã±ã³ã¹ã調ã¹ãŠãããå¹ççãªä»£æ¿ææ®µã«çœ®ãæããããšã«ãããããŒãããŒã«æé©åã¯Pythonã³ãŒããããé«éãã€ã³ã³ãã¯ãã«ããã®ã«è²¢ç®ããŸããå¶éã¯ãããŸãããå šäœçãªPythonæé©åæŠç¥ã®éèŠãªéšåã§ããç¶ããŸãã
ããŒãããŒã«æé©åããã®ä»ã®æé©åæè¡ãçè§£ããããšã¯ãããå¹ççãªPythonã³ãŒããèšè¿°ãã髿§èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸãããã¹ããã©ã¯ãã£ã¹ã«åŸããå©çšå¯èœãªããŒã«ãšã©ã€ãã©ãªã掻çšããããšã§ãPythonã®å¯èœæ§ãæå€§éã«åŒãåºããããã©ãŒãã³ã¹ãšä¿å®æ§ã®äž¡æ¹ãåããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
詳现ãªèªã¿ç©
- Python disã¢ãžã¥ãŒã«ã®ããã¥ã¡ã³ãïŒhttps://docs.python.org/3/library/dis.html
- CPythonãœãŒã¹ã³ãŒãïŒç¹ã«ããŒãããŒã«ãªããã£ãã€ã¶ãŒïŒïŒæé©åããã»ã¹ã®è©³çްãªçè§£ã®ããã«ãCPythonãœãŒã¹ã³ãŒãã調ã¹ãŠãã ããã
- ã³ã³ãã€ã©æé©åã«é¢ããæžç±ãšèšäºïŒãã®åéã®å æ¬çãªçè§£ãåŸãã«ã¯ãã³ã³ãã€ã©èšèšãšæé©åæè¡ã«é¢ãããªãœãŒã¹ãåç §ããŠãã ããã